package org.batatasframework.support.definition;

import org.batatasframework.support.database.FieldSelectable;
import org.batatasframework.support.database.metadatas.FieldMetadata;
import org.batatasframework.support.database.spi.FieldGroupable;

/**
 * <pre>
 * 定义的一个查询字段，这个字段可能是多个字段连接进来的，如字段相加等，
 * 所以这个字段就不能出现在查询条件里
 * 
 * 这是解析到的基本信息的字段定义，由该定义可以生成4种类型的扩展字段：
 * 1. 供界面选择的字段集
 * 2. 供界面选择的查询条件集
 * 3. 用来解析返回结构集的字段的解析器
 * 4. 用来解析查询条件的解析器
 * 
 * <hr/>
 * 注意，有一些字段的定义是不适合当作查询字段的，如：多个字段值的累加等。
 * 也可以通过指定，指定一些字段不作查询条件或不作显示字段
 * </pre>
 * @author jackson
 *
 */
public interface FieldDefinition extends FieldMetadata, FieldGroupable, FieldSelectable{
	
	/**
	 * <pre>
	 * 这个key是用于界面与后面字段的绑定，本来是可以直接使用字段来处理的，
	 * 但考虑到不应该把数据库结构的定义暴露到客户端，所以这里使用运行时动态
	 * 生成的不重复的字符串来处理
	 * </pre>
	 */
	String getKey();

	/** 
	 * 被定义的字段，是否包括了元字段数据的定义；
	 * 如：这里是查询字段的定义，查询的内容是N个字段的格式化处理，这里就是判断某一个元字段是否被定义在这个查询字段上 
	 */
	boolean contains(FieldMetadata fieldMetadata);

	String getTitle();
	
	Object getFormat();
	
	int getOrdinal();
	
	boolean isMustDiaplay();
	
	Boolean unGroup();
	
}
